// 声明一个对象
// 不推荐这种方式写，因为万物皆对象，对象更多的作用是定义里面的属性
let a: object
a = {}
a = function(){}

// 定义一个对象，并声明其中有一个 type: string 的 name 属性
let b: { name: string }
b = { name: '123' }

// 定义一个对象，并定义其中的 age 变量有无都行
let c: { age?: number }
c = { age: 18 }
c = {}

// 定义一个对象，name 属性必传，其他属性有无都行，且不指定类型
let d: { name: string, [propname: string]: any }
d = { name: 'zxn', age: 18, sex: '男' }

// 定义一个函数对象，传入两个number类型变量，且返回值为number类型
let e: (a: number, b: number) => number
e = function(n1: number, n2: number): number{
    return 10
}

// 定义一个函数对象，两个number类型参数必传，且可接受其他任意类型参数，且返回值为number
let f: (a: number, b: number, [propname]: any) => number
f = function(a,b,c: string): number {
    return 10
}

// 声明一个字符串类型数组，其内容都是string类型
// 方式一
let g: string[]
g = ['1', '2', '3']
// 方式二
let h: Array<number>
h = [1,2,3]

// 定义一个固定长度为2的元组
let i: [string, string]
i = ['hello', 'ts']

// 定义一个枚举
enum Sex {
    Male = 0,
    Female = 1
}
let j: { name: string, sex: Sex }
j = {
    name: 'zxn',
    sex: Sex.Male
}
console.log(j.sex === Sex.Male)

// 类型的别名
let myType = 1 | 2 | 3 | 4 | 5
let k = myType
let l = myType